import 'package:flutter/material.dart';
import 'package:flutter_app/util/DataUtil.dart';
import 'package:flutter_app/util/ToastUtil.dart';
import 'package:flutter_app/util/shared_preferences.dart';

/// 于处理异步操作的，异步处理成功了就执行成功的操作，异步处理失败了就捕获错误或者停止后续操作。一个Future只会对应一个结果，要么成功，要么失败。

class FutureListWidget extends StatefulWidget {
  final String? text;

  FutureListWidget({this.text}) : super();

  @override
  State<StatefulWidget> createState() {
    return _FutureState();
  }
}

class _FutureState extends State<FutureListWidget> {
  var list = DataUtil.getFuture();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.text ?? ""),
      ),
      body: ListView.builder(
        itemCount: list.length,
        itemBuilder: _buildItem,
      ),
    );
  }
}

Widget _buildItem(BuildContext context, int index) {
  var list = DataUtil.getFuture();
  return Container(
    padding: EdgeInsets.only(top: 20, left: 20, right: 20),
    alignment: Alignment.center,
    width: 100,
    height: 80,
    child: GestureDetector(
      child: DecoratedBox(
        decoration: BoxDecoration(
            gradient: LinearGradient(colors: [Colors.red, Colors.orange]),
            //背景渐变
            borderRadius: BorderRadius.circular(3.0),
            boxShadow: [
              BoxShadow(
                  color: Colors.grey, offset: Offset(2.0, 2.0), blurRadius: 4.0)
            ]),
        child: Center(
          child: Text(
            list[index],
            textAlign: TextAlign.center,
            style: TextStyle(fontSize: 20, color: Colors.white),
          ),
        ),
      ),
      onTap: () {
        toArount(index, context, list[index]);
      },
    ),
  );
}

void toArount(int index, BuildContext context, String title) {
  switch (index) {
    case 0:
      Future.delayed(new Duration(seconds: 2), () {
        //return "hi world!";
        throw AssertionError("Error");
      }).then((data) {
        //执行成功会走到这里
        print(data);
      }).catchError((e) {
        //执行失败会走到这里
        print(e);
      }).whenComplete(() {
        //无论成功或失败都会走到这里
        ToastUtil.toastShort("then,whenComplete");
      });
      break;
    case 1:
      //等待多个异步任务都执行结束后才进行一些操作，比如我们有一个界面，需要先分别从两个网络接口获取数据，获取成功后，我们需要将两个接口数据进行特定的处理后再显示到UI界面上
      Future.wait([
        // 2秒后返回结果
        Future.delayed(new Duration(seconds: 2), () {
          return "hello";
        }),
        // 4秒后返回结果
        Future.delayed(new Duration(seconds: 2), () {
          return " world";
        })
      ]).then((results) {
        print(results[0] + results[1]);
      }).catchError((e) {
        print(e);
      });
      break;
    case 2:
      task();
      break;
  }
}

///
/// async用来表示函数是异步的，定义的函数会返回一个Future对象，可以使用then方法添加回调函数。
///  await 后面是一个Future，表示等待该异步任务完成，异步完成后才会往下走；await必须出现在 async 函数内部
///
task() async {
  try {
    var bool = await SPUtils.putString("LK", "李逵");
    print('保存是否成功$bool');
    var string = SPUtils.getString("LK");
    print('LK对应的名字$string');
    String id = await login("alice", "******");
    print("11111111111-------");
    String userInfo = await getUserInfo(id);
    print("222222222-------");
    await saveUserInfo(userInfo);
    //执行接下来的操作
    print("全部执行完了哈哈哈-------");
  } catch (e) {
    //错误处理
    print(e);
  }
}

Future<String> login(String s, String t) {
  return Future.delayed(new Duration(seconds: 3), () {
    print("执行login花了1秒-----");
    return "12345";
  });
}

Future<String> saveUserInfo(String userInfo) {
  return Future.delayed(new Duration(seconds: 2), () {
    print("saveUserInfo-------");
    return "saveUserInfo";
  });
}

// ignore: missing_return
Future<String> getUserInfo(String id) {
  return Future.delayed(new Duration(seconds: 1), () {
    print("执行getUserInfo花了2秒-----");
    return "getUserInfo";
  });
}
